| brasil ¶

1.1 | Importando pacotes usados ¶

In [ ]:
import numpy as np
import pandas as pd
import plotly.express as px
from plotly.subplots import make_subplots
import plotly.graph_objects as go
import plotly.io as pio
In [ ]:
import plotly.io as pio
pio.renderers
Out[ ]:
Renderers configuration
-----------------------
    Default renderer: 'notebook'
    Available renderers:
        ['plotly_mimetype', 'jupyterlab', 'nteract', 'vscode',
         'notebook', 'notebook_connected', 'kaggle', 'azure', 'colab',
         'cocalc', 'databricks', 'json', 'png', 'jpeg', 'jpg', 'svg',
         'pdf', 'browser', 'firefox', 'chrome', 'chromium', 'iframe',
         'iframe_connected', 'sphinx_gallery', 'sphinx_gallery_png']
In [ ]:
pio.renderers.default = "notebook"

1.2 | Funções usadas ¶

In [ ]:
def equivalencia_linha(tabulacao_cruzada):
    """Essa função determina as esquivalências por linha entre dois mapas de uso e cobertura da terra (UTC).
        Recebe como entrada uma matriz de tablução cruzada entre os dois mapas.
    """
    
    mapeamento_linha = []
    for index, row in tabulacao_cruzada.iterrows():
        max_row = row.sort_values(ascending=False)
        mapeamento_linha.append(tabulacao_cruzada.loc[: , max_row.index[0]])
    
    mapeamento_linha = pd.DataFrame(data=mapeamento_linha)
    
    linhas = mapeamento_linha.index.tolist()
    colunas = mapeamento_linha.columns.tolist()
    data_tuples = list(zip(colunas, linhas))
    mapeamento_linha = pd.DataFrame(data_tuples, columns=['Quarto_Inventario','MapBiomas'])
    
    for i in range(len(mapeamento_linha)):
        mapeamento_linha.loc[i, "Size"] = tabulacao_cruzada.loc[(mapeamento_linha["Quarto_Inventario"][i])].max()
        
    return mapeamento_linha
In [ ]:
def equivalencia_coluna(tabulacao_cruzada):
    """Essa função determina as esquivalências por coluna entre dois mapas de uso e cobertura da terra (UTC).
        Recebe como entrada uma matriz de tablução cruzada entre os dois mapas.
    """
    
    mapeamento_coluna = []
    for column in range(0, tabulacao_cruzada.shape[1]):
        max_column = tabulacao_cruzada.iloc[:, column].sort_values(ascending=False)
        mapeamento_coluna.append(tabulacao_cruzada.loc[max_column.index[0], :])
    
    mapeamento_coluna = pd.DataFrame(data=mapeamento_coluna)
    
    linhas = mapeamento_coluna.index.tolist()
    colunas = mapeamento_coluna.columns.tolist()
    data_tuples = list(zip(colunas, linhas))
    mapeamento_coluna = pd.DataFrame(data_tuples, columns=['MapBiomas', 'Quarto_Inventario'])
    
    mapeamento_coluna.loc[:, ("Size")] = 0
    
    for i in range(len(mapeamento_coluna)):
         mapeamento_coluna.loc[i, "Size"] = tabulacao_cruzada.loc[:, (mapeamento_coluna["MapBiomas"][i])].max()
        
    return mapeamento_coluna
In [ ]:
def legenda_harmonizada(mapeamento_linha, mapeamento_coluna):
    """
        Determina a harmonização das legendas a partir das harmonizações por linha e por coluna.
    """
    
    legenda = pd.merge(equivalencias_linha, equivalencias_coluna, how="outer")
    
    return legenda
In [ ]:
def nodify(node_names):
    '''
        Cria os nódulos para agrupar cada legendas em uma coluna a partir da legenda gerada
        pela função harmonizacao_2_sankey e geras as cores de cada nódulo por coluna.
    '''
    # uniqe name endings
    ends = sorted(list(set([e[-1] for e in node_names])))
    
    # intervals
    steps = 0

    # x-values for each unique name ending
    # for input as node position
    nodes_x = {}
    node_colors = {}
    xVal = 0
    for e in ends:
        if e != " ":
            nodes_x[str(e)] = xVal
            xVal += steps + 0.3
        else:
            nodes_x[str(e)] = xVal
            xVal += steps
            
    for e in ends:
        if e != "'":
            node_colors[str(e)] = '#84caa0'
        else:
            node_colors[str(e)] = '#37986a'

    # x and y values in list form
    x_values = [nodes_x[n[-1]] for n in node_names]
    y_values = [0.01]*len(x_values)
    
    node_colors = [node_colors[n[-1]] for n in node_names]
    
    return x_values, y_values, node_colors
In [ ]:
def df_2_sankey(df,cols,values,hover_value=None):
    """ 
        Helper function to convert a dataframe of relationships to 
        Plotly Sankey format.
    """
    colors = ['#D0EDA6','#EDEF7B','#EF7B84','#00308f','#eedc82','#c66']
    out = df.copy()
    entities = dict()
    vals_ = [values,hover_value]
    try: 
        vals_.remove(None)
    except:
        pass
    
    # get dict of uid for each entity in each level from 0...n
    for n,c in enumerate(cols):
        if n == 0:
            out[f'{c}_'] = pd.factorize(out[c])[0]
        else:
            out[f'{c}_'] = pd.factorize(out[c])[0] + (out[f'{cols[n-1]}_'].max()+1)
        entities[n] = dict(out[[cols[n]+'_',cols[n]]].values)

    # create df edge list between source,targets
    edge_list = list()
    for i in range(0, len(cols), 1):
        slice_ = cols[i:i+2]
        if len(slice_)==2:
            el_ = out.groupby([f'{c}_' for c in slice_],as_index=False)[vals_].sum()
            el_.columns = ['source','target']+vals_
            edge_list.append(el_)
    edge_list = pd.concat(edge_list,ignore_index=True)

    # Sankey node definitions are simply the ordered uid/names of each entity 
    labels = [v[i] for k,v in entities.items() for i in v] # use v[i] for name, i for uid
    node_colors = [colors[k] for k in entities.keys() for i in entities[k]]

    # Sankey edge definitions
    source = list(edge_list['source'])
    target = list(edge_list['target'])
    values = list(edge_list[values])
    
    if hover_value is None:
        hover_values = list()
    else:
        hover_values = list(edge_list[hover_value])
    if len(source) == len(target) == len(values):
        return edge_list,entities,labels,node_colors,source,target,values,hover_values
    else:
        raise Exception('Output test fail: lists are of unequal lengths')
In [ ]:
def harmonizacao_2_sankey(df):
    """
    Gera os outputs necessários para gerar o diagrama de Sankey via plotly para a legenda harmonizada.
    """      
    equivalencias_linha = equivalencia_linha(df)
    _df = pd.DataFrame()
    _df["source"] = equivalencias_linha["Quarto_Inventario"] + "!"
    _df["target"] = equivalencias_linha["MapBiomas"] + "'"
    _df["value"] = equivalencias_linha["Size"]
    
    equivalencias_coluna = equivalencia_coluna(df)
    _df2 = pd.DataFrame()
    _df2["source"] = equivalencias_coluna["MapBiomas"] + "'"
    _df2["target"] = equivalencias_coluna["Quarto_Inventario"].astype(str) + " "
    _df2["value"] = equivalencias_coluna["Size"]
    
    _df = pd.concat([_df, _df2], ignore_index=True)
    
    legendas = pd.concat([_df['source'], _df['target']])
    legendas = legendas.unique()
    legenda = {x: index for index, x in enumerate(legendas)}
    
    nodified_x, nodified_y, node_colors = nodify(legendas)
    
    source = []
    target = []
    value = []
    for linha in _df.iterrows():
        source.append(legenda.get(linha[1].source))
        target.append(legenda.get(linha[1].target))
        value.append(linha[1].value)
    
    return legendas, source, target, value, node_colors, nodified_x, nodified_y

1.3 | Legendas dos mapas de acordo com os valores de pixel ¶

In [ ]:
mapbiomas_col7_legenda = {
    1 : "Floresta",
    3 : "Formação Florestal",
    4 : "Formação Savânica",
    5 : "Mangue",
    49 : "Restinga Arborizada",
    10 : "Formação Natural não Florestal",
    11 : "Campo Alagado e Área Pantanosa",
    12 : "Formação Campestre",
    32 : "Apicum",
    29 : "Afloramento Rochoso",
    50 : "Restinga Herbácea",
    13 : "Outras Formações não Florestais",
    14 : "Agropecuária",
    15 : "Pastagem",
    18 : "Agricultura",
    19 : "Lavoura Temporária",
    39 : "Soja",
    20 : "Cana",
    40 : "Arroz (beta)",
    62 : "Algodão (beta)",
    41 : "Outras Lavouras Temporárias",
    36 : "Lavoura Perene",
    46 : "Café",
    47 : "Citrus",
    48 : "Outras Lavouras Perenes",
    9 : "Silvicultura",
    21 : "Mosaico de Usos",
    22 : "Área não Vegetada",
    23 : "Praia, Duna e Areal",
    24 : "Área Urbanizada",
    30 : "Mineração",
    25 : "Outras Áreas não Vegetadas",
    26 : "Corpo D'água",
    33 : "Rio, Lago e Oceano",
    31 : "Aquicultura",
    27 : "Não Observado"
}

quarto_inventario_legenda = {
    1 : "Floresta manejada (FM)",
    2 : "Floresta não manejada (FNM)",
    3 : "Floresta secundária (FSec)",
    4 : "Corte seletivo (CS)",
    5 : "Reflorestamento (Ref)",
    6 : "Campo manejado (GM)",
    7 : "Campo não manejado (GNM)",
    8 : "Campo secundário (GSec)",
    9 : "Pastagem (Ap)",
    10 : "Pastagem degradada (APD)",
    11 : "Outras formações lenhosas manejadas (OFLM)",
    12 : "Outras formações lenhosas não manejadas (OFLNM)",
    13 : "Outras formações lenhosas secundárias (OFLSec)",
    14 : "Agricultura anual  (AC)",
    15 : "Agricultura perene (PER)",
    16 : "Agricultura semiperene  (CANA)",
    17 : "Água (A)",
    18 : "Reservatório (Res)",
    19 : "Assentamento (S)",
    20 : "Dunas manejadas (DnM)",
    21 : "Dunas não manejadas (DnNM)",
    22 : "Afloramento rochoso manejado (ArM)",
    23 : "Afloramento rochoso não manejado (ArNM)",
    24 : "Mineração (Min)",
    25 : "Solo exposto (SE)",
    26 : "Áreas não observadas (NO)"
}

1.4 | Carregando os dados ¶

In [ ]:
df = pd.read_csv("../confusion_matrix/tab_cruz_brasil.csv", index_col="Unnamed: 0")

df.head()
Out[ ]:
0.0 11.0 12.0 15.0 20.0 21.0 23.0 24.0 25.0 255.0 ... 32.0 33.0 39.0 4.0 40.0 41.0 48.0 5.0 62.0 9.0
0.0 9876896659 0 0 0 0 0 0 0 0 20178754064 ... 0 0 0 0 0 0 0 0 0 0
1.0 0 40062533 332302138 64645231 0 9548 81046 51527 2597 15714006 ... 1044540 41804700 4844 51478546 0 1656333 3570 37292451 0 39431
2.0 0 48300147 208391400 314268416 46613 473683 67592 233240 50582 6991810 ... 465990 62039313 803929 78982869 0 2738526 356629 13824545 14 893291
3.0 0 5297656 15541078 170031638 23737 216153 973 157752 51114 295771 ... 31269 4935847 449155 13100528 0 1649116 486682 490406 14 1421665
4.0 0 10213 33348 1049461 0 0 0 0 0 35 ... 0 4844 4655 2366 0 11081 2198 0 0 994

5 rows × 22 columns

1.5 | Tratando os dados ¶

In [ ]:
df.shape
Out[ ]:
(25, 22)
In [ ]:
df.index
Out[ ]:
Index([ 0.0,  1.0,  2.0,  3.0,  4.0,  5.0,  6.0,  7.0,  8.0,  9.0, 10.0, 11.0,
       12.0, 13.0, 14.0, 15.0, 16.0, 17.0, 18.0, 19.0, 20.0, 21.0, 24.0, 25.0,
       26.0],
      dtype='float64')
In [ ]:
df.columns
Out[ ]:
Index(['0.0', '11.0', '12.0', '15.0', '20.0', '21.0', '23.0', '24.0', '25.0',
       '255.0', '3.0', '30.0', '32.0', '33.0', '39.0', '4.0', '40.0', '41.0',
       '48.0', '5.0', '62.0', '9.0'],
      dtype='object')
In [ ]:
df = df.drop(index=0.0, columns=["0.0", "255.0"])


df.head()
Out[ ]:
11.0 12.0 15.0 20.0 21.0 23.0 24.0 25.0 3.0 30.0 32.0 33.0 39.0 4.0 40.0 41.0 48.0 5.0 62.0 9.0
1.0 40062533 332302138 64645231 0 9548 81046 51527 2597 15052521540 1013124 1044540 41804700 4844 51478546 0 1656333 3570 37292451 0 39431
2.0 48300147 208391400 314268416 46613 473683 67592 233240 50582 9304941107 1270752 465990 62039313 803929 78982869 0 2738526 356629 13824545 14 893291
3.0 5297656 15541078 170031638 23737 216153 973 157752 51114 616997409 803397 31269 4935847 449155 13100528 0 1649116 486682 490406 14 1421665
4.0 10213 33348 1049461 0 0 0 0 0 64700125 0 0 4844 4655 2366 0 11081 2198 0 0 994
5.0 123711 7224931 11281305 63 15176 0 24752 3948 12868856 11900 0 11774 46732 513471 0 595931 156793 0 0 18692996

1.6 | Mapeando os nomes das classes ¶

In [ ]:
classes_mapa1 = df.columns.astype(float)
classes_mapa2 = df.index

# Mapeando os valores de pixels com os nomes das classes
mapa1_legenda = list(map(mapbiomas_col7_legenda.get, classes_mapa1))
mapa2_legenda = list(map(quarto_inventario_legenda.get, classes_mapa2))
In [ ]:
mapa1_legenda
Out[ ]:
['Campo Alagado e Área Pantanosa',
 'Formação Campestre',
 'Pastagem',
 'Cana',
 'Mosaico de Usos',
 'Praia, Duna e Areal',
 'Área Urbanizada',
 'Outras Áreas não Vegetadas',
 'Formação Florestal',
 'Mineração',
 'Apicum',
 'Rio, Lago e Oceano',
 'Soja',
 'Formação Savânica',
 'Arroz (beta)',
 'Outras Lavouras Temporárias',
 'Outras Lavouras Perenes',
 'Mangue',
 'Algodão (beta)',
 'Silvicultura']
In [ ]:
mapa2_legenda
Out[ ]:
['Floresta manejada (FM)',
 'Floresta não manejada (FNM)',
 'Floresta secundária (FSec)',
 'Corte seletivo (CS)',
 'Reflorestamento (Ref)',
 'Campo manejado (GM)',
 'Campo não manejado (GNM)',
 'Campo secundário (GSec)',
 'Pastagem (Ap)',
 'Pastagem degradada (APD)',
 'Outras formações lenhosas manejadas (OFLM)',
 'Outras formações lenhosas não manejadas (OFLNM)',
 'Outras formações lenhosas secundárias (OFLSec)',
 'Agricultura anual  (AC)',
 'Agricultura perene (PER)',
 'Agricultura semiperene  (CANA)',
 'Água (A)',
 'Reservatório (Res)',
 'Assentamento (S)',
 'Dunas manejadas (DnM)',
 'Dunas não manejadas (DnNM)',
 'Mineração (Min)',
 'Solo exposto (SE)',
 'Áreas não observadas (NO)']
In [ ]:
# Renomeando linhas e colunas de acordo com as classes 
df.columns = mapa1_legenda
df.index = mapa2_legenda

df.head()
Out[ ]:
Campo Alagado e Área Pantanosa Formação Campestre Pastagem Cana Mosaico de Usos Praia, Duna e Areal Área Urbanizada Outras Áreas não Vegetadas Formação Florestal Mineração Apicum Rio, Lago e Oceano Soja Formação Savânica Arroz (beta) Outras Lavouras Temporárias Outras Lavouras Perenes Mangue Algodão (beta) Silvicultura
Floresta manejada (FM) 40062533 332302138 64645231 0 9548 81046 51527 2597 15052521540 1013124 1044540 41804700 4844 51478546 0 1656333 3570 37292451 0 39431
Floresta não manejada (FNM) 48300147 208391400 314268416 46613 473683 67592 233240 50582 9304941107 1270752 465990 62039313 803929 78982869 0 2738526 356629 13824545 14 893291
Floresta secundária (FSec) 5297656 15541078 170031638 23737 216153 973 157752 51114 616997409 803397 31269 4935847 449155 13100528 0 1649116 486682 490406 14 1421665
Corte seletivo (CS) 10213 33348 1049461 0 0 0 0 0 64700125 0 0 4844 4655 2366 0 11081 2198 0 0 994
Reflorestamento (Ref) 123711 7224931 11281305 63 15176 0 24752 3948 12868856 11900 0 11774 46732 513471 0 595931 156793 0 0 18692996

Convertendo os valores de pixel para milhões de hectares.

In [ ]:
df2 = df

df = round(df * 0.09 / 1000000, 2)

df.head()
Out[ ]:
Campo Alagado e Área Pantanosa Formação Campestre Pastagem Cana Mosaico de Usos Praia, Duna e Areal Área Urbanizada Outras Áreas não Vegetadas Formação Florestal Mineração Apicum Rio, Lago e Oceano Soja Formação Savânica Arroz (beta) Outras Lavouras Temporárias Outras Lavouras Perenes Mangue Algodão (beta) Silvicultura
Floresta manejada (FM) 3.61 29.91 5.82 0.0 0.00 0.01 0.00 0.0 1354.73 0.09 0.09 3.76 0.00 4.63 0.0 0.15 0.00 3.36 0.0 0.00
Floresta não manejada (FNM) 4.35 18.76 28.28 0.0 0.04 0.01 0.02 0.0 837.44 0.11 0.04 5.58 0.07 7.11 0.0 0.25 0.03 1.24 0.0 0.08
Floresta secundária (FSec) 0.48 1.40 15.30 0.0 0.02 0.00 0.01 0.0 55.53 0.07 0.00 0.44 0.04 1.18 0.0 0.15 0.04 0.04 0.0 0.13
Corte seletivo (CS) 0.00 0.00 0.09 0.0 0.00 0.00 0.00 0.0 5.82 0.00 0.00 0.00 0.00 0.00 0.0 0.00 0.00 0.00 0.0 0.00
Reflorestamento (Ref) 0.01 0.65 1.02 0.0 0.00 0.00 0.00 0.0 1.16 0.00 0.00 0.00 0.00 0.05 0.0 0.05 0.01 0.00 0.0 1.68

2.1 | Análise dos dados ¶

2.1.1 | Tabulação Cruzada ¶

In [ ]:
results = []
for p_key, values in df.items():
    for key, value in values.items():
        results.append({"source": p_key, "target": key, "value": value})
        # print(p_key, key, value)

df_list = pd.DataFrame(results, columns=['target', 'source', 'value'])
df_list
Out[ ]:
target source value
0 Floresta manejada (FM) Campo Alagado e Área Pantanosa 3.61
1 Floresta não manejada (FNM) Campo Alagado e Área Pantanosa 4.35
2 Floresta secundária (FSec) Campo Alagado e Área Pantanosa 0.48
3 Corte seletivo (CS) Campo Alagado e Área Pantanosa 0.00
4 Reflorestamento (Ref) Campo Alagado e Área Pantanosa 0.01
... ... ... ...
475 Dunas manejadas (DnM) Silvicultura 0.00
476 Dunas não manejadas (DnNM) Silvicultura 0.00
477 Mineração (Min) Silvicultura 0.00
478 Solo exposto (SE) Silvicultura 0.00
479 Áreas não observadas (NO) Silvicultura 0.00

480 rows × 3 columns

In [ ]:
fig = px.imshow(df.replace(0, None), text_auto=True, aspect="auto", height=1000, title='Matriz de Tabulação Cruzada entre os mapas (Mha)')
fig.show()
In [ ]:
fig = make_subplots(
    rows=2, cols=1,
    shared_yaxes='all',
    specs=[[{"type": "xy"}],[{"type": "xy"}]],
    subplot_titles=("<b>MapBiomas Col. 7 - brasil<b>", "<b>Quarto Inventário Nacional - brasil<b>")
)

fig.add_trace(go.Bar(y= df.sum(), x=df.sum().index, text=((df.sum())).astype(int).astype(str)+"Mha"),
              row=1, col=1)

fig.add_trace(go.Bar(y = df.sum(axis='columns').sort_values(ascending=False), 
                     x=df.sum(axis='columns').sort_values(ascending=False).index, 
                     text=((df.sum(axis='columns').sort_values(ascending=False))).astype(int).astype(str)+"Mha"),
              row=2, col=1)

fig.update_layout(title_text="<b>Distribuição das Classes por Mapa da Região Estudada<b>",
                  height=1000,
                  width=1200,
                  showlegend=False
                  )

fig.update_layout(barmode='stack', xaxis={'categoryorder':'total descending'})

fig.show()

2.2 | Equivalências por linha ¶

In [ ]:
equivalencias_linha = equivalencia_linha(df)
display(equivalencias_linha)
Quarto_Inventario MapBiomas Size
0 Floresta manejada (FM) Formação Florestal 1354.73
1 Floresta não manejada (FNM) Formação Florestal 837.44
2 Floresta secundária (FSec) Formação Florestal 55.53
3 Corte seletivo (CS) Formação Florestal 5.82
4 Reflorestamento (Ref) Silvicultura 1.68
5 Campo manejado (GM) Formação Campestre 7.77
6 Campo não manejado (GNM) Formação Campestre 5.31
7 Campo secundário (GSec) Formação Campestre 0.08
8 Pastagem (Ap) Pastagem 307.17
9 Pastagem degradada (APD) Formação Campestre 0.01
10 Outras formações lenhosas manejadas (OFLM) Formação Campestre 15.39
11 Outras formações lenhosas não manejadas (OFLNM) Formação Campestre 10.77
12 Outras formações lenhosas secundárias (OFLSec) Formação Campestre 0.34
13 Agricultura anual (AC) Soja 27.54
14 Agricultura perene (PER) Pastagem 1.11
15 Agricultura semiperene (CANA) Cana 0.53
16 Água (A) Rio, Lago e Oceano 58.27
17 Reservatório (Res) Rio, Lago e Oceano 3.82
18 Assentamento (S) Área Urbanizada 2.01
19 Dunas manejadas (DnM) Campo Alagado e Área Pantanosa 0.00
20 Dunas não manejadas (DnNM) Campo Alagado e Área Pantanosa 0.00
21 Mineração (Min) Mineração 0.70
22 Solo exposto (SE) Pastagem 0.03
23 Áreas não observadas (NO) Formação Florestal 0.52
In [ ]:
edge_list,entities,labels,colors,source,target,values,hover_values = df_2_sankey(equivalencias_linha,['MapBiomas', 'Quarto_Inventario'],values='Size')

fig = go.Figure(data=[go.Sankey(
    valueformat = ".0f",
    node = dict(
      pad = 5,
      thickness = 20,
      line = dict(color = "black", width = 0.5),
      label = labels,
      color = colors,
      customdata=hover_values,
      hovertemplate='Source: %{label}<br />'+
                    'Amount: %{value}<br />'
    ),
    link = dict(
      source = source, # indices correspond to labels, eg A1, A2, A2, B1, ...
      target = target,
      value = values,
      customdata=hover_values,
      hovertemplate='Source: %{source.label}<br />'+
                    'Target: %{target.label}<br />'+
                    'Amount: %{value}<br />', 
  ))])

fig.update_layout(autosize=True,width=900,height=1200,title_text="<b> Quarto_Inventario > MapBiomas | brasil<b>", font_size=12)
fig.show()

2.3 | Equivalências por coluna ¶

In [ ]:
equivalencias_coluna = equivalencia_coluna(df)
display(equivalencias_coluna)
MapBiomas Quarto_Inventario Size
0 Campo Alagado e Área Pantanosa Água (A) 6.32
1 Formação Campestre Floresta manejada (FM) 29.91
2 Pastagem Pastagem (Ap) 307.17
3 Cana Agricultura semiperene (CANA) 0.53
4 Mosaico de Usos Pastagem (Ap) 0.13
5 Praia, Duna e Areal Água (A) 0.03
6 Área Urbanizada Assentamento (S) 2.01
7 Outras Áreas não Vegetadas Pastagem (Ap) 0.03
8 Formação Florestal Floresta manejada (FM) 1354.73
9 Mineração Mineração (Min) 0.70
10 Apicum Floresta manejada (FM) 0.09
11 Rio, Lago e Oceano Água (A) 58.27
12 Soja Agricultura anual (AC) 27.54
13 Formação Savânica Floresta não manejada (FNM) 7.11
14 Arroz (beta) Floresta manejada (FM) 0.00
15 Outras Lavouras Temporárias Pastagem (Ap) 6.06
16 Outras Lavouras Perenes Agricultura perene (PER) 0.61
17 Mangue Floresta manejada (FM) 3.36
18 Algodão (beta) Floresta manejada (FM) 0.00
19 Silvicultura Reflorestamento (Ref) 1.68
In [ ]:
edge_list,entities,labels,colors,source,target,values,hover_values = df_2_sankey(equivalencias_coluna,['MapBiomas', 'Quarto_Inventario'],values='Size')

fig = go.Figure(data=[go.Sankey(
    valueformat = ".0f",
    node = dict(
      pad = 5,
      thickness = 20,
      line = dict(color = "black", width = 0.5),
      label = labels,
      color = colors,
      customdata=hover_values,
      hovertemplate='Source: %{label}<br />'+
                    'Amount: %{value}<br />'
    ),
    link = dict(
      source = source, # indices correspond to labels, eg A1, A2, A2, B1, ...
      target = target,
      value = values,
      customdata=hover_values,
      hovertemplate='Source: %{source.label}<br />'+
                    'Target: %{target.label}<br />'+
                    'Amount: %{value}<br />', 
  ))])

fig.update_layout(autosize=True,width=900,height=1200,title_text="<b> MapBiomas > Quarto_Inventario | brasil<b>", font_size=12)
fig.show()

2.4 | Legenda Harmonizada ¶

In [ ]:
mapeamento = legenda_harmonizada(equivalencias_linha, equivalencias_coluna)
display(mapeamento)
Quarto_Inventario MapBiomas Size
0 Floresta manejada (FM) Formação Florestal 1354.73
1 Floresta não manejada (FNM) Formação Florestal 837.44
2 Floresta secundária (FSec) Formação Florestal 55.53
3 Corte seletivo (CS) Formação Florestal 5.82
4 Reflorestamento (Ref) Silvicultura 1.68
5 Campo manejado (GM) Formação Campestre 7.77
6 Campo não manejado (GNM) Formação Campestre 5.31
7 Campo secundário (GSec) Formação Campestre 0.08
8 Pastagem (Ap) Pastagem 307.17
9 Pastagem degradada (APD) Formação Campestre 0.01
10 Outras formações lenhosas manejadas (OFLM) Formação Campestre 15.39
11 Outras formações lenhosas não manejadas (OFLNM) Formação Campestre 10.77
12 Outras formações lenhosas secundárias (OFLSec) Formação Campestre 0.34
13 Agricultura anual (AC) Soja 27.54
14 Agricultura perene (PER) Pastagem 1.11
15 Agricultura semiperene (CANA) Cana 0.53
16 Água (A) Rio, Lago e Oceano 58.27
17 Reservatório (Res) Rio, Lago e Oceano 3.82
18 Assentamento (S) Área Urbanizada 2.01
19 Dunas manejadas (DnM) Campo Alagado e Área Pantanosa 0.00
20 Dunas não manejadas (DnNM) Campo Alagado e Área Pantanosa 0.00
21 Mineração (Min) Mineração 0.70
22 Solo exposto (SE) Pastagem 0.03
23 Áreas não observadas (NO) Formação Florestal 0.52
24 Água (A) Campo Alagado e Área Pantanosa 6.32
25 Floresta manejada (FM) Formação Campestre 29.91
26 Pastagem (Ap) Mosaico de Usos 0.13
27 Água (A) Praia, Duna e Areal 0.03
28 Pastagem (Ap) Outras Áreas não Vegetadas 0.03
29 Floresta manejada (FM) Apicum 0.09
30 Floresta não manejada (FNM) Formação Savânica 7.11
31 Floresta manejada (FM) Arroz (beta) 0.00
32 Pastagem (Ap) Outras Lavouras Temporárias 6.06
33 Agricultura perene (PER) Outras Lavouras Perenes 0.61
34 Floresta manejada (FM) Mangue 3.36
35 Floresta manejada (FM) Algodão (beta) 0.00
In [ ]:
legendas, source, target, value, node_colors, nodified_x, nodified_y = harmonizacao_2_sankey(df2)

fig = go.Figure(data=[go.Sankey(
    arrangement='snap',
    node = dict(
        pad = 15,
        thickness = 20,
        line = dict(color = "black", width = 0.5),
        label = legendas,
        color = node_colors,
        x=nodified_x,
        y=nodified_y
    ),
    link = dict(
      source = source, # indices correspond to labels, eg A1, A2, A1, B1, ...
      target = target,
      value = value
  ))])


fig.update_layout(autosize=True,width=1000,height=1500,title_text="<b> Inventário > MapBiomas > Inventário | brasil <b>", font_size=12)
fig.show()

Aqui temos uma versão do diagrama sem considerar a quantidade de área identificada. Ele possibilita uma visão mais limpa de como ficaram as concordâncias.

In [ ]:
legendas, source, target, value, node_colors, nodified_x, nodified_y = harmonizacao_2_sankey(df)

value = [1] * len(value)

fig = go.Figure(data=[go.Sankey(
    arrangement='snap',
    node = dict(
        pad = 15,
        thickness = 20,
        line = dict(color = "black", width = 0.5),
        label = legendas,
        color = node_colors,
        x=nodified_x,
        y=nodified_y
    ),
    link = dict(
      source = source, # indices correspond to labels, eg A1, A2, A1, B1, ...
      target = target,
      value = value
  ))])

fig.update_layout(autosize=True,width=1000,height=1500,title_text="<b> Quarto Inventário > MapBiomas | brasil <b>", font_size=12)
fig.show()

2.5 | Análise das Informações Obtidas ¶

In [ ]:
concordancia_geral = round(100 * mapeamento.loc[:, "Size"].sum() / df.to_numpy().sum(), 2)

print("A concordância geral entre os mapas foi de {}%".format(concordancia_geral), "considerando a harmonização obtida.")
A concordância geral entre os mapas foi de 92.38% considerando a harmonização obtida.